/**
 * DeepSeek AI Web聊天服务器
 * 浙江传媒学院 - 俞哲 - 指导老师：栗青生
 * 实验五：AI智能聊天程序 Web版本
 */

const express = require('express');
const WebSocket = require('ws');
const axios = require('axios');
const cors = require('cors');
const path = require('path');
const http = require('http');

// 配置常量
const PORT = 8080;
const WS_PORT = 8081;
const DEEPSEEK_API_KEY = 'sk-daa9f189deb6420b984950be431c49f4';
const DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions';

// 创建Express应用
const app = express();
const server = http.createServer(app);

// 中间件配置
app.use(cors());
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));

// 创建WebSocket服务器
const wss = new WebSocket.Server({ port: WS_PORT });

// AI回复历史记录（简单内存存储）
const conversationHistory = [];

/**
 * 调用DeepSeek API获取AI回复
 * @param {string} message - 用户消息
 * @param {Array} history - 对话历史
 * @returns {Promise<string>} AI回复
 */
async function callDeepSeekAPI(message, history = []) {
    try {
        console.log('🤖 正在调用DeepSeek API...');
        console.log('📝 用户消息:', message);

        // 构建对话上下文
        const messages = [
            {
                role: 'system',
                content: '你是一个友好的AI助手，专门为浙江传媒学院的学生提供编程学习和技术支持。你了解仓颉编程语言、网络编程、TCP/Socket等技术。请用简洁、友好的方式回答问题。'
            },
            ...history.slice(-10), // 保留最近10轮对话
            {
                role: 'user',
                content: message
            }
        ];

        // 发送API请求
        const response = await axios.post(DEEPSEEK_API_URL, {
            model: 'deepseek-chat',
            messages: messages,
            max_tokens: 1000,
            temperature: 0.7,
            stream: false
        }, {
            headers: {
                'Authorization': `Bearer ${DEEPSEEK_API_KEY}`,
                'Content-Type': 'application/json'
            },
            timeout: 30000 // 30秒超时
        });

        const aiReply = response.data.choices[0].message.content;
        console.log('✅ AI回复生成成功');
        console.log('🔤 回复内容:', aiReply.substring(0, 100) + '...');

        return aiReply;

    } catch (error) {
        console.error('❌ DeepSeek API调用失败:', error.message);

        // 错误处理 - 返回友好的错误信息
        if (error.response) {
            console.error('API响应错误:', error.response.status, error.response.data);
            return `抱歉，AI服务暂时不可用（错误代码：${error.response.status}）。请稍后重试或检查网络连接。`;
        } else if (error.code === 'ECONNABORTED') {
            return '抱歉，AI响应超时。请稍后重试。';
        } else {
            return '抱歉，遇到了技术问题。如果问题持续，请检查API配置或网络连接。';
        }
    }
}

/**
 * 格式化消息时间戳
 */
function formatTimestamp() {
    return new Date().toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
    });
}

// WebSocket连接处理
wss.on('connection', (ws) => {
    console.log('🌐 新的WebSocket连接建立');

    // 发送欢迎消息
    const welcomeMessage = {
        type: 'ai_message',
        content: '🤖 欢迎使用DeepSeek AI聊天助手！\n\n我是专为浙江传媒学院学生设计的AI助手，可以帮助您：\n• 学习仓颉编程语言\n• 理解网络编程概念\n• 解答TCP/Socket相关问题\n• 提供编程学习建议\n\n有什么问题随时问我！',
        timestamp: formatTimestamp()
    };

    ws.send(JSON.stringify(welcomeMessage));

    // 处理收到的消息
    ws.on('message', async (data) => {
        try {
            const message = JSON.parse(data);
            console.log('📨 收到消息:', message);

            if (message.type === 'user_message') {
                const userContent = message.content.trim();

                if (!userContent) {
                    ws.send(JSON.stringify({
                        type: 'error',
                        content: '请输入有效的消息内容',
                        timestamp: formatTimestamp()
                    }));
                    return;
                }

                // 添加用户消息到历史
                conversationHistory.push({
                    role: 'user',
                    content: userContent
                });

                // 发送"正在输入"状态
                ws.send(JSON.stringify({
                    type: 'typing',
                    timestamp: formatTimestamp()
                }));

                // 调用DeepSeek API获取回复
                const aiReply = await callDeepSeekAPI(userContent, conversationHistory);

                // 添加AI回复到历史
                conversationHistory.push({
                    role: 'assistant',
                    content: aiReply
                });

                // 发送AI回复
                ws.send(JSON.stringify({
                    type: 'ai_message',
                    content: aiReply,
                    timestamp: formatTimestamp()
                }));
            }

        } catch (error) {
            console.error('❌ 消息处理错误:', error);
            ws.send(JSON.stringify({
                type: 'error',
                content: '消息处理失败，请重试',
                timestamp: formatTimestamp()
            }));
        }
    });

    // 连接关闭处理
    ws.on('close', () => {
        console.log('🔌 WebSocket连接已关闭');
    });

    // 错误处理
    ws.on('error', (error) => {
        console.error('❌ WebSocket错误:', error);
    });
});

// REST API端点
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

// 健康检查端点
app.get('/health', (req, res) => {
    res.json({
        status: 'healthy',
        timestamp: new Date().toISOString(),
        websocket_port: WS_PORT,
        deepseek_api: 'configured'
    });
});

// API状态检查端点
app.get('/api/status', (req, res) => {
    res.json({
        server: 'running',
        deepseek_api_url: DEEPSEEK_API_URL,
        websocket_port: WS_PORT,
        conversation_count: Math.floor(conversationHistory.length / 2),
        timestamp: formatTimestamp()
    });
});

// 启动HTTP服务器
server.listen(PORT, () => {
    console.log('🚀 =================================');
    console.log('🎓 浙江传媒学院 - 仓颉编程语言实验五');
    console.log('📚 实验主题：DeepSeek AI Web聊天应用');
    console.log('👨‍🎓 学生：俞哲  👨‍🏫 指导老师：栗青生');
    console.log('🚀 =================================');
    console.log(`🌐 Web服务器启动: http://localhost:${PORT}`);
    console.log(`🔌 WebSocket服务器启动: ws://localhost:${WS_PORT}`);
    console.log(`🤖 DeepSeek API: ${DEEPSEEK_API_URL}`);
    console.log('✅ 服务器就绪，等待连接...');
    console.log('🚀 =================================');
});

// WebSocket服务器启动日志
console.log(`🔌 WebSocket服务器监听端口: ${WS_PORT}`);

// 优雅关闭处理
process.on('SIGINT', () => {
    console.log('\n🛑 收到关闭信号，正在优雅关闭服务器...');

    wss.close(() => {
        console.log('🔌 WebSocket服务器已关闭');
    });

    server.close(() => {
        console.log('🌐 HTTP服务器已关闭');
        process.exit(0);
    });
});

module.exports = { app, server, wss };